"""
工作流注册表系统
用于管理所有可用工作流的注册和发现
"""

from typing import Dict, Any, List, Optional
import importlib


class WorkflowRegistry:
    """工作流注册表，管理所有可用工作流"""
    
    def __init__(self):
        self.workflows: Dict[str, Dict[str, Any]] = {}
        self._load_builtin_workflows()
    
    def _load_builtin_workflows(self):
        """加载内置工作流"""
        # 标准多代理工作流
        self.register_workflow(
            name="multi-agent", 
            display_name="标准多代理工作流",
            description="标准多代理协作研究流程，包含搜索策略、搜索、分析、质量评估等专业代理",
            creator_func="src.research_core.workflow:create_workflow"
        )
        
        # 优化多代理工作流
        self.register_workflow(
            name="optimized-multi-agent",
            display_name="优化多代理工作流", 
            description="优化版多代理研究流程，包含更高效的搜索和分析策略",
            creator_func="src.research_core.workflow:create_optimized_workflow"
        )
        
        # 流式多代理工作流
        self.register_workflow(
            name="streaming-multi-agent",
            display_name="流式多代理工作流",
            description="支持流式输出的多代理研究流程，适合实时交互场景",
            creator_func="src.research_core.workflow:create_streaming_workflow"
        )
        
        # 增强多代理工作流
        self.register_workflow(
            name="enhanced-multi-agent", 
            display_name="增强多代理工作流",
            description="功能增强版多代理研究流程，支持更复杂的任务编排",
            creator_func="src.research_core.workflow:create_enhanced_workflow"
        )

    def register_workflow(self, name: str, display_name: str, description: str, 
                         creator_func: str, config: Optional[Dict] = None):
        """
        注册工作流
        
        Args:
            name: 工作流唯一标识符
            display_name: 显示名称
            description: 描述信息
            creator_func: 创建工作流的函数路径 (格式: module.path:function_name)
            config: 工作流配置参数
        """
        if name in self.workflows:
            raise ValueError(f"工作流 '{name}' 已存在")
            
        self.workflows[name] = {
            "display_name": display_name,
            "description": description,
            "creator_func": creator_func,
            "config": config or {}
        }
    
    def get_workflow(self, name: str) -> Any:
        """
        获取工作流实例
        
        Args:
            name: 工作流名称
            
        Returns:
            Any: LangGraph工作流实例
            
        Raises:
            ValueError: 如果工作流不存在
        """
        if name not in self.workflows:
            raise ValueError(f"未知的工作流: {name}")
        
        workflow_info = self.workflows[name]
        module_path, func_name = workflow_info["creator_func"].split(":")
        
        try:
            module = importlib.import_module(module_path)
            creator_func = getattr(module, func_name)
            return creator_func(**workflow_info.get("config", {}))
        except (ImportError, AttributeError) as e:
            raise ValueError(f"无法加载工作流 '{name}': {str(e)}")
    
    def list_workflows(self) -> Dict[str, Dict]:
        """列出所有可用工作流"""
        return self.workflows.copy()
    
    def workflow_exists(self, name: str) -> bool:
        """检查工作流是否存在"""
        return name in self.workflows
    
    def get_workflow_info(self, name: str) -> Dict[str, Any]:
        """获取工作流详细信息"""
        if name not in self.workflows:
            raise ValueError(f"未知的工作流: {name}")
        return self.workflows[name].copy()


# 全局工作流注册表实例
workflow_registry = WorkflowRegistry()


def get_workflow_registry() -> WorkflowRegistry:
    """获取工作流注册表实例"""
    return workflow_registry


# 导出
__all__ = ["WorkflowRegistry", "workflow_registry", "get_workflow_registry"]